import Vue from "vue";
import VueRouter from "vue-router";
import routes from "@/router/routes";
import store from "@/store";

Vue.use(VueRouter);

const router = new VueRouter({
    mode: "history",
    base: process.env.BASE_URL, // 基础路径
    routes,
});

// 重写路由的push方法
const routerPush = VueRouter.prototype.push;
VueRouter.prototype.push = function push(location) {
    return routerPush.call(this, location).catch(error => error);
};

// 重写路由的replace方法
const routerReplace = VueRouter.prototype.replace;
VueRouter.prototype.replace = function replace(location) {
    return routerReplace.call(this, location).catch(error => error);
};

// 检验token
const whiteList = ["Login", "Register", "Home", "Search", "Details", "AddCartSuccess", "ShopCart"]; // 白名单
router.beforeEach((to, from, next) => {
    const token = store.state.user.token; // 获取token
    const userInfo = store.state.user.userInfo; // 获取用户信息
    // 如果有token
    if (token) {
        // 判断当前去的地方是不是登录页,如果是登录页,则直接导航到首页
        if (to.path === "/login") {
            next("/");
        } else {
            // 如果去的不是登录页,判断是否有用户信息,如果有用户信息则直接放行
            if (Object.keys(userInfo).length !== 0) {
                next();
            } else {
                // 如果没有用户信息,则请求用户信息
                store
                    .dispatch("user/getUserInfo")
                    .then(() => {
                        next();
                    })
                    .catch(() => {
                        //如果请求用户信息失败,清空所有信息,重新到登录页开始登录
                        store.dispatch("user/resetUserInfo").then(() => {
                            next(`/login?redirect=${to.name}`);
                        });
                    });
            }
        }
    } else {
        // 判断要去的地方是否是白名单地址,如果是则直接放行,如果不是则直接去登录页登录
        if (whiteList.includes(to.name)) {
            next();
        } else {
            /*
             * 因为在token校验的时候,可能我们校验不通过,需要跳转到login
             * 我们希望登录以后,还能直接去我想要去的页面
             * 此时我们在路由守卫导航到login的时候,要携带一个路由的query参数,保存我们希望去的地址
             * 当登录结束后,直接判断是否存在query参数,如果存在,则直接跳转到我们希望的地址
             * */
            next(`/login?redirect=${to.name}`);
        }
    }
});

export default router;
